package com.asa.numanaly.elliptic;

import java.util.Arrays;

/**
 * 椭圆曲线
 * 上面的点
 * 点之间的计算，不想单纯的点计算，重新定义了加法
 * 
 * y^2 = x^3-a*x -b 任意椭圆曲线都可以转换成这种形式
 * 
 *定理(Merdell) E上的点是有限生成的abel群（交换群） （Merdell定理）		注意：有限生成和有限是两码事
 * @author Administrator
 * 
 * 定理（Siegel）对于任何一个椭圆曲线E:y^2 = x^3-a*x -b 其中ab属于整数域，
 * 那么{(x,y)属于E:其中xy属于整数} 那么(x,y)是有限的
 * 
 * 
 * 定理(Nagell-Lutz)
	对于任何一个椭圆曲线E:y^2=x^3 + Ax+ B,A, B∈Z
	假设P(x,y)是E(Q)的一个有限阶点,那么
	1.x(P),y(P)∈z
	2.若y!=0，则y(P)^2整除4A^3 + 27B^2.
 * 
 * 
 * 定义：有理数的高度，设r是一个有理数，则它的高度H(x)定义为max{|m|,|n|}其中r=m/n且(m,n)=1
 * 
 * 定义：平面上一个有理点P(x,y)的高度H(P)定义为H(x)
 * 椭圆曲线的无穷远点的高度H(Q)=1
 * 
 * 
 * 
 * 定理（Thue）
 * 	设abc全是非零整数，则ax^3+by^3=c具有有限个整数解。
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 *
 */
public class EQ {
	
	
	/**
	 * 任意一点。求它的过圆直线的k
	 * @param x
	 * @param y
	 * @param a
	 * @param b
	 * @return
	 */
	public static double getK(double x,double y,double a,double b) {
		double result = (3*x*x+a)/(2*y);
		return result;
	}
	
	
	/**
	 * 设点为P，那么我们要求2*P		自己加自己
	 * 2*P 不能简单理解为 P+P
	 * 2P
	 * @param x
	 * @param y
	 * @param k
	 * @return
	 */
	public static double[] getchen2(double x,double y,double k) {
		double result[] = new double[2];
		result[0]= k*k-2*x;
		result[1]= k*(result[0]-x)+y;

		return result;
	}
	
	
	/**
	 * 加法
	 * @param args
	 */
	public static double[] getplus(double ax,double ay,
			double bx,double by) {
		double result[] = new double[2];
		double k = (by - ay)/(bx-ax);
//		System.out.println(k);
//		System.out.println(1.0/3);
		
		result[0] = k*k -ax - bx;
		result[1] = k*(result[0]-ax)+ay;

		
		return result;
	}
	
	
	
	
	
	public static void main(String[] args) {
		
		double a = 0;
		double b = 17;
		double px = 2;
		double py = 5;
		double qx = -1;
		double qy = 4;
		double k = getK(px, py, a, b);
		System.out.println(k);
		
//		double[] getchen2 = getchen2(px, py, k);
//		for (int i = 0; i < getchen2.length; i++) {
//			double d = getchen2[i];
//			System.out.println(d);
//		}
//		System.out.println(59.0/125.0);

		double[] getplus = getplus(px, py, qx, qy);
		for (int i = 0; i < getplus.length; i++) {
		double d = getplus[i];
		System.out.println(d);
		}
		System.out.println(109.0/27.0);
		
	}
	

}
